iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0
Kubernetes

Kubernetes三十天就上手系列 第 17 篇

Day 17- DaemonSet 在每個節點上運行 Pod

  • 分享至 

  • xImage
  •  

DaemonSet: 在每個節點上運行 Pod

使用 DaemonSet 管理系統級應用

DaemonSet 是 Kubernetes 中的一種控制器,用來確保某個 Pod 在 Cluster 中的每個節點上都能運行一個實例。這使得 DaemonSet 成為管理系統級應用的理想選擇,特別適用於那些需要在所有節點上運行的應用,如紀錄收集器、監控代理、以及網路套件模組。

DaemonSet 的基本概念

  1. 在每個節點上運行 Pod:
    DaemonSet 保證每個節點上至少運行一個 Pod。舉例來說,若你的 Cluster 有五個節點,創建一個 DaemonSet 後,每個節點將分配一個對應的 Pod。

  2. 自動處理新節點的加入與移除:
    當新的節點加入 Cluster 時,DaemonSet 會自動在這些新節點上部署 Pod。同樣,若節點被移除,該節點上的 DaemonSet Pod 也會被自動清除。

  3. 滾動更新:
    DaemonSet 支援滾動更新,這樣可以在不影響服務的情況下逐步更新應用。Kubernetes 會依次更新每個節點上的 Pod,確保 Cluster 的高可用性。

DaemonSet 的運行架構

DaemonSet 運行架構示意圖

如圖所示,當你創建一個 DaemonSet 時,它會在 Cluster 中的每個節點(如 Node-1、Node-2 和 Node-3)上部署一個 Pod。這些 Pod 的部署是自動化且一致的,確保所有節點均運行相同的應用程式(如監控代理或網路套件模組)。

圖中展示的流程強調了 DaemonSet 的自動化特性,使得當新節點加入時,Pod 會自動在新節點上部署,並在節點移除時自動清除。

DaemonSet 的應用場景

  1. 系統監控:
    DaemonSet 可用來部署如 Prometheus Node Exporter 或 Datadog Agent 等監控代理,以便在每個節點上收集資源使用情況和性能指標,並匯總至中央監控系統。

  2. 紀錄收集:
    紀錄收集器如 Fluentd 或 Filebeat 可以通過 DaemonSet 在每個節點上運行,並將節點上的紀錄檔案傳輸到中央化的紀錄系統(例如 Elasticsearch)。

  3. 網路套件模組:
    DaemonSet 經常用於在所有節點上運行網路套件模組,如 Calico、Weave 或 Flannel,這些套件模組為 Kubernetes 提供網路通訊功能。

  4. 安全監控:
    安全代理如 Falco 可以通過 DaemonSet 部署,用來監控節點上的安全事件,並即時檢測異常行為。

Daemon Pods 調度機制

DaemonSet Pod 的調度機制與普通 Pod 略有不同,它具有以下幾個特點:

  1. 直接調度到節點:

    • DaemonSet Pod 並不依賴於 Kubernetes 的標準調度器 (kube-scheduler) 來分配節點。相反,當 DaemonSet 被創建或更新時,Kubernetes 自動在 Cluster 的每個節點上生成一個 Pod,而不需要標準調度流程。
  2. 新節點加入時自動部署:

    • 當新的節點加入 Cluster 時,DaemonSet 會立即在該節點上創建對應的 Pod,而無需手動干預。這一機制確保即使 Cluster 動態變化,系統級應用仍然能在所有節點上自動運行。
  3. 考慮節點容忍度 (Tolerations):

    • DaemonSet 支援在有特殊標記(如控制平面節點、帶有特定污點的節點)上的 Pod 調度。這些通過 tolerations 來設定,確保某些 DaemonSet Pod 可以在標準 Pod 無法運行的節點上部署。
  4. 控制平面節點的特殊處理:

    • 預設情況下,普通 Pod 不會調度到控制平面節點上。但 DaemonSet 可以通過設定 tolerations 允許 Pod 運行在這些節點上,這對於像 Fluentd 這類需要收集所有節點紀錄的應用來說尤為重要。
  5. 資源預留與優先級:

    • 在一些情況下,DaemonSet Pod 需要比其他工作負載更高的優先級,以確保它們在節點上的資源得到保障。這可以通過設定 priorityClassName 來實現,防止其他低優先級的 Pod 佔用關鍵資源。
  6. Pod 自動清理:

    • 當節點從 Cluster 中移除時,DaemonSet 會自動清理該節點上的 Pod,無需手動操作,確保資源不被浪費。

Pod 調度過程的簡化流程

  1. DaemonSet Controller 創建 Pod:
    當 DaemonSet 被創建時,DaemonSet Controller 會根據節點的數量生成對應數量的 Pod,而不是由標準的 kube-scheduler 進行分配。

  2. 新節點加入Cluster時:
    當一個新節點加入Cluster,DaemonSet Controller 會自動在該節點上部署新的 Pod,保證所有節點的應用一致性。

  3. Pod 調度到容忍的節點:
    如果某些節點帶有特定污點(如控制平面節點),DaemonSet 可以通過 tolerations 來允許 Pod 調度到這些節點,確保所有節點都運行該應用。

DaemonSet 的 Pod 調度機制充分考慮了在 Cluster 中運行系統級應用的需求,能夠自動處理新節點的加入與舊節點的移除,並靈活支援對特定節點進行調度。這些特性使得 DaemonSet 成為在分布式環境中運行紀錄收集器、監控代理和網路套件模組等應用的理想選擇。

創建 DaemonSet 的步驟

以下是一個官方提供的 DaemonSet YAML 定義範例,用於在每個節點上部署 Fluentd,來收集並轉發紀錄資料到 Elasticsearch:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      tolerations:
      # these tolerations are to have the daemonset runnable on control plane nodes
      # remove them if your control plane nodes should not run pods
      - key: node-role.kubernetes.io/control-plane
        operator: Exists
        effect: NoSchedule
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      containers:
      - name: fluentd-elasticsearch
        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
      # it may be desirable to set a high priority class to ensure that a DaemonSet Pod
      # preempts running Pods
      # priorityClassName: important
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log

範例解析:

  • namespace: kube-system:此 DaemonSet 部署在 kube-system 命名空間中,這通常是系統級應用所在的位置。
  • tolerations:允許 DaemonSet 在控制平面節點(例如控制器或主節點)上運行。若不希望在這些節點上運行 Pods,可以刪除這部分設定。
  • resources:設置了資源限制和請求,以確保每個 Pod 在運行時有足夠的計算資源。
  • volumeMounts 和 volumes:掛載主機的 /var/log 路徑,以便 Fluentd 收集紀錄資料。

管理 DaemonSet

  • 查看 DaemonSet:使用 kubectl get daemonsets 命令查看 Cluster 中的所有 DaemonSet。
  • 查看 DaemonSet Pod:使用 kubectl get pods -l app=nginx 來查看特定 DaemonSet 創建的所有 Pod。
  • 滾動更新 DaemonSet:使用 kubectl rollout restart daemonset <daemonset-name> 來觸發滾動更新。

DaemonSet 與其他控制器的區別

  • DaemonSet vs. Deployment:Deployment 通常用於管理無狀態應用,通過 ReplicaSet 控制 Pod 的副本數量,而 DaemonSet 保證每個節點上運行一個 Pod。
  • DaemonSet vs. StatefulSet:StatefulSet 更適合有狀態應用,提供穩定的網路標識和持久儲存,而 DaemonSet 專注於無狀態、系統級應用的部署。

總結

DaemonSet 是 Kubernetes 中不可或缺的控制器,適合用來管理需要在所有節點上運行的系統級應用。這種部署方式確保應用在Cluster中隨著節點變動能自動調整,保持高可用性。

接下來在後面的文章中,我們將會深入探討 Kubernetes 中的 Pod 調度策略與資源管理,進一步提高你對 Kubernetes Cluster 的控制和運營能力。


上一篇
Day 16- StatefulSet 管理有狀態應用
下一篇
Day 18- Job 與 CronJob 處理一次性和定期任務
系列文
Kubernetes三十天就上手 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言